package jp.co.nes.awssupport.common.dao;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.commons.dbutils.ResultSetHandler;

import jp.co.nes.awssupport.common.bean.BaseBean;

/**
 * 読み込みハンドラで使用する抽象クラスです。
 *
 * @param <T> 読み込んだ内容を設定するBeanクラス
 */
public abstract class ReadHandler<T extends BaseBean> implements ResultSetHandler<Boolean> {

    /** 読み込むBeanクラスのClassオブジェクト */
    private Class<T> beanClass;

    /** 読み込み区分 */
    private ReadType readType;

    /**
     * 読み込むBeanクラスのClassオブジェクト、読み込み区分を引数にもつコンストラクタです。
     *
     * @param beanClass 読み込むBeanクラスのClassオブジェクト
     * @param readType 読み込み区分
     */
    public ReadHandler(Class<T> beanClass, ReadType readType) {
        this.beanClass = beanClass;
        this.readType = readType;
    }

    /*
     * (非 Javadoc)
     * @see org.apache.commons.dbutils.ResultSetHandler#handle(java.sql.ResultSet)
     */
    @Override
    public Boolean handle(ResultSet rs) throws SQLException {
        // データ存在しなかった場合は、falseを返却する。
        boolean isExist = false;
        while (rs.next()) {
            if (!isExist) {
                isExist = true;
            }
            BeanProcessorEx processor = new BeanProcessorEx();
            read(processor.toBean(rs, beanClass));
        }
        return isExist;
    }

    /**
     * 読み込み区分を返却します。
     *
     * @return 読み込み区分
     */
    public ReadType getReadType() {
        return readType;
    }

    /**
     * 読み込み処理です。<br>
     * 読み込んだ内容をBeanクラスに設定し、本メソッドを呼び出します。
     *
     * @param bean 読み込んだ内容を設定したBeanクラス
     */
    protected abstract void read(T bean);
}
